package com.masq.aboard.common.util;

import com.masq.aboard.common.enums.ResultCode;
import com.masq.aboard.common.exceptions.BaseException;

import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * 时间相关工具类，提供日期的格式化、解析等功能。
 * @author masq
 * @since 2024-05-04
 */
public class DateUtil {

    // 默认日期时间格式
    public static final String DEFAULT_DATETIME_FORMAT = "yyyy-MM-dd HH:mm:ss";

    // 默认日期格式
    public static final String DEFAULT_DATE_FORMAT = "yyyy-MM-dd";

    // 默认时间格式
    public static final String DEFAULT_TIME_FORMAT = "HH:mm:ss";

    // 人性化日期时间格式
    public static final String HUM_DATETIME_FORMAT = "yyyy/MM/dd HH:mm:ss";

    // 用于文件路径的日期格式
    public static final String SOLIDUS_DATE_FORMAT = "yyyy/MM/dd";

    // ISO日期时间格式
    public static final String ISO_DATETIME_FORMAT = "yyyy-MM-dd'T'HH:mm:ss";

    // ISO日期时间格式，包含毫秒
    public static final String ISO_DATETIME_MILLIS_FORMAT = "yyyy-MM-dd'T'HH:mm:ss.SSS";

    // 完整的ISO日期时间格式，包含时区
    public static final String COMPLETE_ISO_DATETIME_FORMAT = "yyyy-MM-dd'T'HH:mm:ss.SSSXXX";



    /**
     * 根据指定格式格式化日期。
     * @param date 待格式化的日期对象。
     * @param format 指定的日期格式字符串。
     * @return 格式化后的日期字符串。
     */
    public static String format(Date date, String format) {
        SimpleDateFormat sdf = new SimpleDateFormat(format);
        return sdf.format(date);
    }

    /**
     * 使用默认格式（yyyy-MM-dd HH:mm:ss）格式化日期。
     * @param date 待格式化的日期对象。
     * @return 格式化后的日期字符串。
     */
    public static String format(Date date) {
        return format(date, DEFAULT_DATETIME_FORMAT);
    }

    /**
     * 根据指定格式解析日期字符串。
     * @param dateStr 待解析的日期字符串。
     * @param format 指定的日期格式字符串。
     * @return 解析后的Date对象。
     * @throws BaseException 如果日期格式错误，则抛出异常。
     */
    public static Date parse(String dateStr, String format) {
        SimpleDateFormat sdf = new SimpleDateFormat(format);
        try {
            return sdf.parse(dateStr);
        } catch (Exception e) {
            throw new BaseException(ResultCode.DATE_FORMAT_ERROR);
        }
    }

    /**
     * 使用默认格式（yyyy-MM-dd HH:mm:ss）解析日期字符串。
     * @param dateStr 待解析的日期字符串。
     * @return 解析后的Date对象。
     * @throws BaseException 如果日期格式错误，则抛出异常。
     */
    public static Date parse(String dateStr) {
        return parse(dateStr, DEFAULT_DATETIME_FORMAT);
    }

    /**
     * 将日期转换为用于文件路径的格式字符串。
     * @param date 待转换的日期对象。
     * @return 转换后的日期字符串，格式为"yyyy/MM/dd"。
     */
    public static String dateToFilePath(Date date) {
        return format(date, SOLIDUS_DATE_FORMAT);
    }

    /**
     * 使用当前时间生成用于文件路径的日期格式字符串。
     * @return 当前日期的字符串表示，格式为"yyyy/MM/dd"。
     */
    public static String dateToFilePath() {
        return dateToFilePath(new Date());
    }
}
